package javase1.day10.demo06;
/*
对象的向上转型，就是多态写法：
格式:父类名称 对象名=new 子类名称();               Animal animal=new Cat();
含义：右侧穿件子类对象，把它当做父类来看待使用       创建了一直猫，当做动物看待，没问题
注意事项：向上转型一定是安全的。从小范围转向了大范围，从小范围的猫向上转换成为更大范围的动物


向上转型一定是安全的。但是也有弊端
对象一旦向上转型为父类，就没法使用子类特有方法

解决方案：
对象的向下转型(其实就是一个【还原】的动作)：
格式：子类名称 对象名=(子类名称)父类对象;
含义：将父类对象，【还原】成原本的子类对象
 Animal animal=new Cat();//本来是猫，向上转型成为动物
 Cat cat =(Cat)animal;//本来是猫，已经被当成了动物，还原成原本的猫

注意：
a.必须保证对象本来创建的时候，就是猫，才能向下转型成为猫
b.如果对象创建时本来不是猫，现在非要向下转型成为猫，就会报错:java.lang.ClassCastException类型转化错误

 */
public class DemoMain {
    public static void main(String[] args) {
        //向上转型猫成为了动物
        Animal animal=new Cat();
        animal.eat();
//        animal.catchMouse();错误写法，没有办法使用子类特有方法
        //向下转型动物成为了猫
        Cat cat=(Cat)animal;
        cat.catchMouse();
        //错误的向下转型
        //编译时不会报错，运行时会报错java.lang.ClassCastException:
        Dog dog=(Dog)animal;
        dog.watchHouse();
    }
}
